﻿#define _CRT_SECURE_NO_WARNINGS


#include <stdio.h>
#include <stdlib.h>



//这里是后面知识点中提炼的一点，最后再看
//#include <stdbool.h>
//#include <windows.h>
//WINAPI，具体咋描述以后再了解，先描述下用法(下面是SetConsoleCursorPosition函数的使用举例)
//bool WINAPI SetConsoleCursorPosition(
//	HANDLE hConsoleOutput,
//	COORD pos
//);
//int main()
//{
//	HANDLE houtput = NULL;
//	houtput = GetStdHandle(STD_OUTPUT_HANDLE);//获得标准输出设备的句柄
//
//	COORD pos = { 10, 20 };//定位光标的位置
//
//	SetConsoleCursorPosition(houtput, pos);//就这样用，毕竟上面定义时又没用struct，又不是结构体
//	//就是在houtput这个句柄的操作设备下，去录入pos的信息(大概就是这个意思)
//
//	return 0;
//}





//6.2控制台程序
//int main()
//{
//	system("mode con cols=100 lines=30");//设置控制台窗口列100，行30
//	system("title 贪吃蛇");//设置控制台窗口标题为贪吃蛇
//	system("pause");//暂停
//
//	getchar();//获取字符，不输入程序会暂停，可以当暂停使用
//
//	return 0;
//}



#include <windows.h>
//6.3控制台屏幕上的坐标COORD

//COORD类型的声明
//typedef struct _COORD {
//SHORT X;				//设置x坐标
//SHORT Y;				//设置y坐标
//} COORD, * PCOORD;

//int main()
//{
//	HANDLE hOutput = NULL;
//	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//
//	COORD pos = { 10,20 };//其他看不懂，下面详细了解
//
//	SetConsoleCursorPosition(hOutput, pos);
//	printf("1");
//	getchar();
//
//}



//6.4GetStdHandle
//GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备（标准输⼊、标准输出或标
//准错误）中取得⼀个句柄（⽤来标识不同设备的数值），使⽤这个句柄可以操作设备。
//STD_INPUT_HANDLE((DWORD)-10)	标准输入设备。 最初，这是输入缓冲区 CONIN$ 的控制台。
//STD_OUTPUT_HANDLE((DWORD)-11)	标准输出设备。 最初，这是活动控制台屏幕缓冲区 CONOUT$。
//STD_ERROR_HANDLE((DWORD)-12)	标准错误设备。 最初，这是活动控制台屏幕缓冲区 CONOUT$
//int main()
//{
//	HANDLE houtput = NULL;//定义HANDLE类型的指针
//	houtput = GetStdHandle(STD_OUTPUT_HANDLE);//获得标准输出设备的句柄
//
//	return 0;
//}



#include <stdbool.h>
//6.5GetConsoleCursorInfo
//检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息

//GetConsoleCursorInfo类型的声明
//BOOL WINAPI GetConsoleCursorInfo(
//	HANDLE hConsoleOutput,							//获取句柄
//	PCONSOLE_CURSOR_INFO lpConsoleCursorInfo		//下个结构体的指针
//);
//PCONSOLE_CURSOR_INFO 是指向 CONSOLE_CURSOR_INFO 结构的指针，该结构接收有关主机游标

//CONSOLE_CURSOR_INFO类型的声明
//typedef struct _CONSOLE_CURSOR_INFO {
//	DWORD dwSize;				//设置光标大小
//	BOOL  bVisible;				//设置光标显示状态
//} CONSOLE_CURSOR_INFO, * PCONSOLE_CURSOR_INFO;

//int main()
//{
//	HANDLE houtput = NULL;
//	houtput = GetStdHandle(STD_OUTPUT_HANDLE);//获得标准输出设备的句柄
//
//	//定义一个光标信息的结构体
//	CONSOLE_CURSOR_INFO cursor_info = { 0 };
//
//	//获取和houtput句柄相关的控制台上的光标信息，存放在cursor_info中
//	GetConsoleCursorInfo(houtput, &cursor_info);
//
//	//修改光标的占比
//	cursor_info.dwSize = 100;//可以看到控制台上的光标覆盖了整个格子
//
//	//隐藏光标
//	cursor_info.bVisible = false;//设置光标的显示状态,false表示不显示光标
//
//	//设置和houtput句柄相关的控制台上的光标信息
//	SetConsoleCursorInfo(houtput, &cursor_info);
//
//	getchar();
//	return 0;
//}//要使用两次SetConsoleCursorInfo，一次获取信息，一次设置信息



//6.7SetConsoleCursorPosition
//设置指定控制台屏幕缓冲区中的光标位置，我们将想要设置的坐标信息放在COORD类型的pos中，调
//⽤SetConsoleCursorPosition函数将光标位置设置到指定的位置。

//SetConsoleCursorPosition声明
//BOOL WINAPI SetConsoleCursorPosition(
//	HANDLE hConsoleOutput,
//	COORD pos
//);

//封装⼀个设置光标位置的函数
//void SetPos(short x, short y)
//{
//	HANDLE houtput = NULL;
//	houtput = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出的句柄
//
//	//设置光标位置
//	COORD pos = { x, y };
//	SetConsoleCursorPosition(houtput, pos);
//}
//int main()
//{
//	SetPos(4, 4);
//	printf("abc\n");
//
//	return 0;
//}



//6.8GetAsyncKeyState

//获取按键情况，GetAsyncKeyState的函数原型如下：
//SHORT GetAsyncKeyState(
//	int vKey
//);
//将键盘上每个键的虚拟键值传递给函数，函数通过返回值来分辨按键的状态。

//GetAsyncKeyState 的返回值是short类型，在上⼀次调⽤ GetAsyncKeyState 函数后，如果
//返回的16位的short数据中，最⾼位是1，说明按键的状态是按下，如果最⾼是0，说明按键的状态是抬
//起；如果最低位被置为1则说明，该按键被按过，否则为0。
//ps：总结：按下,最高1 ；抬起,最高0 ；按过,最低1 ；没按过,最低0

//如果我们要判断⼀个键是否被按过，可以检测GetAsyncKeyState返回值的最低值是否为1

#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )//听说是为了防止啥，后面会讲
//这里按位与&可以复习下，有0取0，同1取1

//int main()
//{
//	while (1)
//	{
//		if (KEY_PRESS(0x60))
//		{
//			printf("你按了数字键0\n");
//		}
//		else if (KEY_PRESS(0x61))
//		{
//			printf("你按了数字键1\n");
//		}
//		else if (KEY_PRESS(0x62))
//		{
//			printf("你按了数字键2\n");
//		}
//		else if (KEY_PRESS(0x63))
//		{
//			printf("你按了数字键3\n");
//		}
//		else if (KEY_PRESS(0x64))
//		{
//			printf("你按了数字键4\n");
//		}
//		else if (KEY_PRESS(0x65))
//		{
//			printf("你按了数字键5\n");
//		}
//		else if (KEY_PRESS(0x66))
//		{
//			printf("你按了数字键6\n");
//		}
//		else if (KEY_PRESS(0x67))
//		{
//			printf("你按了数字键7\n");
//		}
//		else if (KEY_PRESS(0x68))
//		{
//			printf("你按了数字键8\n");
//		}
//		else if (KEY_PRESS(0x69))
//		{
//			printf("你按了数字键9\n");
//		}
//	}
//	return 0;
//}



//7.1地图的设计相关知识点
 
//<locale.h>本地化
//<locale.h>提供的函数⽤于控制C标准库中对于不同的地区会产⽣不⼀样⾏为的部分。
//在标准中，依赖地区的部分有以下⼏项：
//• 数字量的格式
//• 货币量的格式
//• 字符集
//• ⽇期和时间的表⽰形式

//类项
//下面每个宏都指定一个类项 
//• LC_COLLATE：影响字符串⽐较函数 strcoll() 和 strxfrm() 。
//• LC_CTYPE：影响字符处理函数的⾏为。
//• LC_MONETARY：影响货币格式。
//• LC_NUMERIC：影响 printf() 的数字格式。
//• LC_TIME：影响时间格式 strftime() 和 wcsftime() 。
//• LC_ALL - 针对所有类项修改，将以上所有类别设置为给定的语⾔环境。

//setlocale函数
//char* setlocale(int category, const char* locale);
//具体用法看课件或者浏览器搜索
//总结一点：
//正常模式setlocale(LC_ALL, "C");//在任意程序执⾏开始，都会隐藏式执⾏调⽤
//本地模式setlocale(LC_ALL, " ");//本地模式可以打印宽字符，方便后续贪吃蛇的完成


#include <locale.h>
//int main()
//{
//	char* ret = setlocale(LC_ALL, NULL);//LC_ALL将所有类项设置为给定(NULL)语言环境
//	printf("%s\n", ret);//这里打印C，表明当前运行环境为C语言运行环境
//
//	ret = setlocale(LC_ALL, "");//""里为空是默认语言，一般为自己所在国家语言(当然如果""里改为English就会以英文结果打印)
//	printf("%s\n", ret);//这里打印结果为中文简体
//
//	//其他用法下面讨论
//	return 0;
//}

#include <time.h>       /* time_t, struct tm, time, localtime, strftime */
//下面好多函数，暂时不管
//int main()
//{
//    time_t rawtime;//定义一个time_t类型的数据
//    struct tm* timeinfo;//定义一个struct tm*类型的数据
//    char buffer[80];//定义一个字符串数组
//
//    struct lconv* lc;//定义一个struct lconv*类型的数据
//
//    time(&rawtime);
//    timeinfo = localtime(&rawtime);
//
//    int twice = 0;
//
//    do {
//        printf("Locale is: %s\n", setlocale(LC_ALL, NULL));
//
//        strftime(buffer, 80, "%c", timeinfo);
//        printf("Date is: %s\n", buffer);
//
//        lc = localeconv();
//        printf("Currency symbol is: %s\n-\n", lc->currency_symbol);
//
//        setlocale(LC_ALL, "");
//    } while (!twice++);//可以使这个while循环运行两次
//
//    return 0;
//}//过

int main()
{//宽字符打印演示
	char* ret = setlocale(LC_ALL, "");//设置为本地模式(允许宽字符的打印)

	char a1 = 'a';
	char b1 = 'b';
	printf("%c %c\n", a1, b1);

	//wprintf("%lc\n", L'a');
	//wprintf("%lc\n", L'b');//打印的很奇怪，暂时不管，可能因为a，b这些不是宽字符的原因

	//printf("比特\n");
	//wprintf(L"比特\n");//缘由猜测同上

	//■●★
	printf("●");
	wprintf(L"●");//搞不懂，好像都可以，写贪吃蛇的时候都试试

	return 0;
}


